// 导入fs模块
const fs = require('fs');
// 导入fs模块中的子模块
const promises = require('fs/promises');
// 导入path模块
const path = require( 'path' );

// 注意这里暂时先使用 async 修饰函数，不深入研究
let loadDirState = async function(){
    // 通过 await 可以"等待"一个异步函数"执行结束后"再执行后续操作
    let fileHandle = await promises.open(__dirname);
    // 通过 FileHandle 来获得 文件描述符 ( File Descriptor )
    let fd = fileHandle.fd ;
    console.log( `file descriptor: ${ fd }` );

    let callback = (error,stats)=>{
        if(error){
            console.log(error);
            return;
        }
        console.log('目录状态: ',stats);
        // 在 fs 模块中定义的 Stats "类" 表示 文件或目录的状态
        // fs.Stats 的 isDirectory 方法用于判断当前路径所表示的是否是目录
        console.log( 'is directory: ' , stats.isDirectory() );
    }

    // 异步获取 文件 或 目录 的状态
    // fs.fstat( fd [, options] , callback )
    fs.fstat( fd , { bigint: true } , callback);
}

loadDirState();

let loadFileState = async function(){
    
    let fileHandle = await promises.open(__filename);
    let fd = fileHandle.fd ;

    // 同步获取 文件 或 目录 的状态
    // fs.fstatSync( fd [, options] )
    let stats = fs.fstatSync( fd , { bigint: false } );
    console.log( '文件状态' , stats );
    // 在 fs 模块中定义的 Stats "类" 表示 文件或目录的状态
    // fs.Stats 的 isFile 方法用于判断当前路径所表示的是否是文件
    console.log( 'is file: ' , stats.isFile() );
}

loadFileState();

// 总结:
// 1、通过 fs.promises 中的 open 方法可以获得一个 FileHandle 进而获得 FileDescriptor
// 2、通过 fs.fstat 或 fs.fstatSync 可以获取指定路径所表示文件或目录的状态
// 3、通过 fs.Stats "类"的实例可以获得 文件或目录 的状态信息
// 4、通过 fs.Stats 提供的 isDirectory 和 isFile 方法可以判断指定路径表示的是目录还是文件

// 注意:
// 1、async 和 await 是目前还没讲到的，咱们只是暂用，不是深入研究
// 2、fs.promises 中提供了大量与 Promise 相关的操作，我们仅使用了 open 函数，其它不做研究